package com.wh.wisdomsite.xbox.common.error;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.NoSuchMessageException;
import org.springframework.context.support.MessageSourceAccessor;
import java.util.EnumMap;
import java.util.Locale;

/**
 * 定义子错误集合对象
 * @Package com.wh.wisdomsite.xbox.common.error
 * @author 谢泽鹏
 * @date 2014年10月8日 下午4:02:14
 * @Copyright 个人版权所有
 * @Company 贵州万华科技有限公司Copyright (c) 2014
 * @version V1.0
 */
public class SubErrors {


    private static final Log logger = LogFactory.getLog(SubErrors.class);

    private static MessageSourceAccessor messageSourceAccessor;

    private static final EnumMap<SubErrorType, MainErrorType> SUBERROR_MAINERROR_MAPPINGS = new EnumMap<SubErrorType, MainErrorType>(SubErrorType.class);


    static {
        //服务不可用(未激活)
        SUBERROR_MAINERROR_MAPPINGS.put(SubErrorType.ISP_SERVICE_UNAVAILABLE, MainErrorType.SERVICE_CURRENTLY_UNAVAILABLE);
        //服务请求服务超时
        SUBERROR_MAINERROR_MAPPINGS.put(SubErrorType.ISP_SERVICE_TIMEOUT, MainErrorType.SERVICE_CURRENTLY_UNAVAILABLE);
        //服务业务参数丢失
        SUBERROR_MAINERROR_MAPPINGS.put(SubErrorType.ISV_MISSING_PARAMETER, MainErrorType.MISSING_REQUIRED_ARGUMENTS);
        //业务参数不匹配
        SUBERROR_MAINERROR_MAPPINGS.put(SubErrorType.ISV_PARAMETERS_MISMATCH, MainErrorType.INVALID_ARGUMENTS);
        //服务业务参数失效
        SUBERROR_MAINERROR_MAPPINGS.put(SubErrorType.ISV_INVALID_PARAMETE, MainErrorType.INVALID_ARGUMENTS);
        //服务不存在
        SUBERROR_MAINERROR_MAPPINGS.put(SubErrorType.ISV_NOT_EXIST, MainErrorType.INVALID_ARGUMENTS);
        //服务业务参数不匹配
        SUBERROR_MAINERROR_MAPPINGS.put(SubErrorType.ISV_INVALID_PERMISSION, MainErrorType.INSUFFICIENT_ISV_PERMISSIONS);
    }


    private static final String PARAM_1 = "xxx";
    private static final String PARAM_2 = "yyy";



    /**
     * 根据子错误获取主错误类型
     * @param subErrorType
     * @param locale
     * @return
     */
    public static MainError getMainError(SubErrorType subErrorType, Locale locale) {
        return MainErrors.getMainError(SUBERROR_MAINERROR_MAPPINGS.get(subErrorType), locale);
    }


    /**
     * 获取详细错误
     * @param subErrorCode 子错误代码
     * @param subErrorKey  子错误信息键
     * @param locale       本地化
     * @param params       本地化参数
     * @return
     */
    public static SubError getSubError(String subErrorCode, String subErrorKey, Locale locale, Object... params) {
        try {
            String parsedSubErrorMessage = messageSourceAccessor.getMessage(subErrorKey, params, locale);
            return new SubError(subErrorCode, parsedSubErrorMessage);
        } catch (NoSuchMessageException e) {

            throw e;
        }
    }

    /**
     * 获取子错误代码
     * @param subErrorType
     * @param params
     * @return
     */
    public static String getSubErrorCode(SubErrorType subErrorType, Object... params) {
        String subErrorCode = subErrorType.value();
        if (params.length > 0) {
            if (params.length == 1) {
                subErrorCode = subErrorCode.replace(PARAM_1, (String) params[0]);
            } else {
                subErrorCode = subErrorCode.replace(PARAM_1, (String) params[0]);
                if (params[1] != null) {
                    subErrorCode = subErrorCode.replace(PARAM_2, (String) params[1]);
                }
            }
        }
        return subErrorCode;
    }


    /**
     * 提供set方法
     * @param errorMessageSourceAccessor
     */
    public static void setMessageSourceAccessor(MessageSourceAccessor errorMessageSourceAccessor) {
        SubErrors.messageSourceAccessor = errorMessageSourceAccessor;
    }

}
